package com.yequan.leetcode.array.countcharacters;

import java.util.HashMap;
import java.util.Map;

/**
 * //给你一份『词汇表』（字符串数组） words 和一张『字母表』（字符串） chars。
 * //
 * // 假如你可以用 chars 中的『字母』（字符）拼写出 words 中的某个『单词』（字符串），那么我们就认为你掌握了这个单词。
 * //
 * // 注意：每次拼写时，chars 中的每个字母都只能用一次。
 * //
 * // 返回词汇表 words 中你掌握的所有单词的 长度之和。
 * //
 * //
 * //
 * // 示例 1：
 * //
 * // 输入：words = ["cat","bt","hat","tree"], chars = "atach"
 * //输出：6
 * //解释：
 * //可以形成字符串 "cat" 和 "hat"，所以答案是 3 + 3 = 6。
 * //
 * //
 * // 示例 2：
 * //
 * // 输入：words = ["hello","world","leetcode"], chars = "welldonehoneyr"
 * //输出：10
 * //解释：
 * //可以形成字符串 "hello" 和 "world"，所以答案是 5 + 5 = 10。
 * //
 * //
 * //
 * //
 * // 提示：
 * //
 * //
 * // 1 <= words.length <= 1000
 * // 1 <= words[i].length, chars.length <= 100
 * // 所有字符串中都仅包含小写英文字母
 * //
 * // Related Topics 数组 哈希表
 *
 * @author : Administrator
 * @date : 2020/3/17
 */
public class CountCharacters {

    public static void main(String[] args) {
        String[] words1 = new String[]{"cat", "bt", "hat", "tree"};
        String chars1 = "atach";
        String[] words2 = new String[]{"hello", "world", "leetcode"};
        String chars2 = "welldonehoneyr";
        CountCharacters countCharacters = new CountCharacters();
        int length = countCharacters.countCharacters2(words1, chars1);
        System.out.println(length);

    }

    /**
     * 解题思路
     * 1.将字母表中每一个字母出现的个数记录下来存放在charMap中
     * 2.遍历单词表中每一个单词,再将每一个单词中字母出现的次数都记录下来,存放在wordCharMap中
     * 3.比较字母出现的次数,只要是wordCharMap中字母出现的次数不大于charMap中的就认为是合理的
     *
     * @param words
     * @param chars
     * @return
     */
    public int countCharacters1(String[] words, String chars) {
        Map<Character, Integer> charMap = new HashMap<>();
        for (char c : chars.toCharArray()) {
            charMap.put(c, charMap.getOrDefault(c, 0) + 1);
        }

        Map<Character, Integer> wordCharMap;
        int length = 0;
        for (String word : words) {
            boolean flag = true;
            wordCharMap = new HashMap<>();
            for (char c : word.toCharArray()) {
                int count = wordCharMap.getOrDefault(c, 0) + 1;
                if (count > charMap.getOrDefault(c, 0)) {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                length += word.length();
            }
        }
        return length;
    }

    /**
     * 对于规定只有大写或者小写的单词或字母时,用一个长度为26的数组记录每一个字母出现的次数
     * 对于小写字母: 每个字母c所在的下标为: index = c-'a'
     * 对于大写字母: 每个字母c所在的下标为: index = c-'A'
     * 思路跟上一种解法一样
     *
     * @param words
     * @param chars
     * @return
     */
    public int countCharacters2(String[] words, String chars) {
        int[] charsArray = new int[26];
        for (char c : chars.toCharArray()) {
            charsArray[c - 'a'] += 1;
        }
        int length = 0;
        a:
        for (String word : words) {
            int[] wordCharArray = new int[26];
            for (char c : word.toCharArray()) {
                wordCharArray[c - 'a'] += 1;
            }
            for (int i = 0; i < 26; i++) {
                if (wordCharArray[i] > charsArray[i]) {
                    continue a;
                }
            }
            length += word.length();
        }
        return length;
    }

}
